Arduino প্রোগ্রামিংয়ে Interrupts এবং Timer Functions ব্যবহৃত হয় নির্দিষ্ট ঘটনার সময় স্বয়ংক্রিয়ভাবে কোডের অংশ চালানোর জন্য। এটি প্রোগ্রামের কার্যকারিতা বাড়ায় এবং বিভিন্ন পরিস্থিতিতে দ্রুত সাড়া দেওয়ার সুযোগ দেয়।
Interrupt হলো একটি সিগন্যাল যা Arduino বোর্ডকে জানায় যে একটি গুরুত্বপূর্ণ ঘটনা ঘটেছে, এবং এটি স্বয়ংক্রিয়ভাবে চলমান প্রোগ্রামটি থামিয়ে দেয় এবং একটি নির্দিষ্ট ফাংশন (ইন্টারাপ্ট সার্ভিস রুটিন বা ISR) চালায়।
volatile int interruptCounter = 0; // ভোলাটাইল ভেরিয়েবল
void setup() {
Serial.begin(9600);
pinMode(2, INPUT); // পিন 2 ইনপুট হিসেবে কনফিগার করা
attachInterrupt(digitalPinToInterrupt(2), countInterrupt, RISING); // ISR যোগ করা
}
void loop() {
Serial.println(interruptCounter); // ইন্টারাপ্ট কাউন্ট প্রিন্ট করা
delay(1000); // ১ সেকেন্ড অপেক্ষা
}
void countInterrupt() {
interruptCounter++; // ইন্টারাপ্ট ঘটলে কাউন্ট বাড়ানো
}
Timer Functions ব্যবহার করে নির্দিষ্ট সময় অন্তর কোন কোড বা কার্যক্রম সম্পাদন করা যায়। Arduino তে টাইমার ব্যবহারের জন্য millis()
এবং micros()
ফাংশন সাধারণত ব্যবহার করা হয়।
millis()
: Arduino চালুর পর মোট মিলিসেকেন্ড গণনা করে। এটি ০ থেকে ৪,২৯৪,৯৬৭ মিলিসেকেন্ড (৪.২৯৪ সেকেন্ড) পর্যন্ত পরিমাপ করে।micros()
: Arduino চালুর পর মোট মাইক্রোসেকেন্ড গণনা করে। এটি ০ থেকে ৪,১৯৯,৯৯৯,৯৯৯ মাইক্রোসেকেন্ড (৪.১৯৯ সেকেন্ড) পর্যন্ত পরিমাপ করে।unsigned long previousMillis = 0; // পূর্ববর্তী সময়ের জন্য ভেরিয়েবল
const long interval = 1000; // ১ সেকেন্ডের ইন্টারভ্যাল
void setup() {
Serial.begin(9600);
}
void loop() {
unsigned long currentMillis = millis(); // বর্তমান সময় সংগ্রহ করা
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // পূর্ববর্তী সময় আপডেট করা
Serial.println("1 second passed"); // ১ সেকেন্ডের বার্তা প্রিন্ট করা
}
}
millis()
এবং micros()
এর মধ্যে ব্যবধান পরীক্ষা করা।Arduino তে Interrupts এবং Timer Functions ব্যবহার করে প্রোগ্রামকে আরও কার্যকর এবং ইন্টারঅ্যাকটিভ করা যায়। এই বৈশিষ্ট্যগুলো ব্যবহারকারীকে দ্রুত প্রতিক্রিয়া জানাতে এবং বিভিন্ন পরিস্থিতিতে কার্যক্রম পরিচালনা করতে সহায়তা করে।
Interrupts হলো একটি শক্তিশালী ফিচার যা মাইক্রোকন্ট্রোলারকে কোনো বিশেষ ঘটনার জন্য অবিলম্বে প্রতিক্রিয়া জানাতে সক্ষম করে। এটি সাধারণত প্রধান কোডের কার্যক্রম চলাকালীন ঘটে এবং কোনো গুরুত্বপূর্ণ ইভেন্ট ঘটলে মাইক্রোকন্ট্রোলারকে তাৎক্ষণিকভাবে সেই ইভেন্টের সাথে সাড়া দিতে দেয়।
Interrupts প্রধানত দুই ধরনের হয়:
নিচে একটি উদাহরণ দেওয়া হলো যেখানে একটি বাটনের প্রেসের জন্য ইন্টারাপ্ট ব্যবহৃত হচ্ছে:
const int buttonPin = 2; // বাটনের পিন
volatile int buttonState = 0; // ইন্টারাপ্টের মাধ্যমে পরিবর্তনশীল মান
void setup() {
pinMode(buttonPin, INPUT); // বাটন পিনকে ইনপুট হিসেবে কনফিগার করা
attachInterrupt(digitalPinToInterrupt(buttonPin), buttonISR, RISING); // ইন্টারাপ্ট সেট করা
Serial.begin(9600); // সিরিয়াল মনিটর শুরু
}
void loop() {
Serial.println(buttonState); // বাটনের অবস্থা প্রিন্ট করা
delay(500); // ০.৫ সেকেন্ড অপেক্ষা
}
void buttonISR() { // ইন্টারাপ্ট রুটিন
buttonState = 1; // বাটন প্রেস হলে মান পরিবর্তন
}
Interrupts ব্যবহার করে Arduino প্রোজেক্টে দ্রুত এবং কার্যকরী প্রতিক্রিয়া নিশ্চিত করা যায়। এটি সেন্সর ডেটা, ব্যবহারকারীর ইনপুট এবং অন্যান্য গুরুত্বপূর্ণ ইভেন্টের জন্য খুবই কার্যকর। Interrupts প্রোগ্রামের কার্যকারিতা এবং কার্যক্ষমতা বাড়ায়, যা বিশেষ করে রিয়েল-টাইম অ্যাপ্লিকেশনগুলোর জন্য অত্যন্ত গুরুত্বপূর্ণ।
Arduino-তে attachInterrupt() এবং detachInterrupt() ফাংশন দুটি ব্যবহার করা হয় একটি নির্দিষ্ট ইন্টারাপ্টের মাধ্যমে বোর্ডের আউটপুট বা কার্যক্রম নিয়ন্ত্রণ করার জন্য। ইন্টারাপ্ট হল এমন একটি প্রক্রিয়া যা বোর্ডের একটি নির্দিষ্ট ইভেন্ট ঘটলে সাড়া দেয়। এই ফাংশনগুলো দিয়ে ইন্টারাপ্ট চালু এবং বন্ধ করা হয়।
attachInterrupt() ফাংশন ব্যবহার করে Arduino বোর্ডে একটি ইন্টারাপ্টের জন্য একটি ফাংশন সংযুক্ত করা হয়। এটি বোর্ডের একটি পিনের উপর একটি নির্দিষ্ট ইভেন্ট ঘটলে নির্দিষ্ট ফাংশনটি কল করে।
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
pin
: ইন্টারাপ্ট পিন, যা সাধারণত ডিজিটাল পিন।ISR
: ইন্টারাপ্ট সার্ভিস রুটিন (ISR) নামক ফাংশন যা ইন্টারাপ্ট ঘটে গেলে কল করা হবে।mode
: ইন্টারাপ্টের ট্রিগার মোড, যা হতে পারে:RISING
: পিনের মান পরিবর্তন হলে যখন এটি উচ্চে ওঠে।FALLING
: পিনের মান পরিবর্তন হলে যখন এটি নীচে নামে।CHANGE
: পিনের মান পরিবর্তন হলে।detachInterrupt() ফাংশন ব্যবহার করে একটি নির্দিষ্ট পিনের জন্য সংযুক্ত ইন্টারাপ্ট বন্ধ করা হয়। এটি বোর্ডকে ইন্টারাপ্ট ট্রিগার করার সময় নির্দিষ্ট ফাংশনটি আর কল করবে না।
detachInterrupt(digitalPinToInterrupt(pin));
pin
: যে পিনের জন্য ইন্টারাপ্টটি বন্ধ করতে হবে।নিচে একটি উদাহরণ দেওয়া হলো যেখানে একটি বোতাম প্রেসের মাধ্যমে LED চালু এবং বন্ধ করা হয়েছে।
const int buttonPin = 2; // বোতাম পিন
const int ledPin = 13; // LED পিন
volatile bool ledState = LOW; // LED এর অবস্থা
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // বোতাম পিন ইনপুট হিসেবে কনফিগার করা
attachInterrupt(digitalPinToInterrupt(buttonPin), toggleLED, FALLING); // ইন্টারাপ্ট সংযুক্ত করা
}
void loop() {
digitalWrite(ledPin, ledState); // LED এর অবস্থা আপডেট করা
}
void toggleLED() {
ledState = !ledState; // LED এর অবস্থা পাল্টানো
}
volatile
: এটি ব্যবহৃত হয় যাতে ISR ভেরিয়েবলটি মূল প্রোগ্রামের সাথে সঠিকভাবে সিঙ্ক্রোনাইজ থাকে। ISR ফাংশনের মধ্যে এই ভেরিয়েবলটি পরিবর্তন করা হয়।attachInterrupt()
: বোতাম প্রেস হলে toggleLED()
ফাংশনটি কল করবে।detachInterrupt()
: এই উদাহরণে ব্যবহৃত হয়নি, কিন্তু এটি বোতামের জন্য ইন্টারাপ্ট বন্ধ করার জন্য ব্যবহার করা যেতে পারে যখন বোতাম আর প্রেস করা হচ্ছে না।delay()
বা দীর্ঘকালীন কোড ব্যবহার করা উচিত নয়, কারণ এটি অন্যান্য কার্যক্রমকে ব্যাহত করতে পারে।attachInterrupt() এবং detachInterrupt() ফাংশন Arduino প্রোগ্রামে ইন্টারাপ্ট ভিত্তিক কাজের জন্য অত্যন্ত কার্যকর। এগুলো ব্যবহার করে দ্রুত সাড়া দেওয়ার ক্ষমতা বাড়ানো যায় এবং বিভিন্ন প্রোজেক্টে কার্যকারিতা উন্নত করা যায়।
Arduino তে Timer Functions ব্যবহার করে নির্দিষ্ট সময়ের ব্যবধানের পর পর কিছু কাজ করা যায়। Timer Functions হল এমন কিছু ফাংশন যা একটি নির্দিষ্ট সময় বা ইন্টারভালে কাজ সম্পন্ন করতে সহায়তা করে। Arduino তে সাধারণত delay()
, millis()
, এবং micros()
ফাংশন ব্যবহার করা হয় টাইমার ফাংশন হিসেবে। এসব ফাংশন বিভিন্ন প্রজেক্টে সঠিক সময় ব্যবধান ধরে রাখতে এবং ইন্টারভাল ভিত্তিক কাজ সম্পন্ন করতে সহায়তা করে।
delay()
: এই ফাংশন নির্দিষ্ট সময়ের জন্য প্রোগ্রামের কার্যক্রম স্থগিত রাখে। এটি মিলিসেকেন্ডে সময় গ্রহণ করে।millis()
: এটি প্রোগ্রাম শুরু হওয়ার পর থেকে কত মিলিসেকেন্ড পেরিয়ে গেছে তা বলে। এটি টাইমার হিসেবেও কাজ করতে পারে।micros()
: এটি প্রোগ্রাম শুরু হওয়ার পর থেকে কত মাইক্রোসেকেন্ড পেরিয়ে গেছে তা বলে।delay()
ফাংশনdelay()
ফাংশন ব্যবহার করলে নির্দিষ্ট সময়ের জন্য প্রোগ্রামের কার্যক্রম স্থগিত হয়। এটি সাধারণত ছোট প্রকল্পে ব্যবধান তৈরি করতে ব্যবহার করা হয়।
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // LED অন
delay(1000); // ১ সেকেন্ড অপেক্ষা
digitalWrite(LED_BUILTIN, LOW); // LED অফ
delay(1000); // ১ সেকেন্ড অপেক্ষা
}
কাজ: এখানে LED প্রতি ১ সেকেন্ড অন্তর অন এবং অফ হবে।
millis()
ফাংশনmillis()
ফাংশন দিয়ে প্রোগ্রাম শুরু হওয়ার পর থেকে কত মিলিসেকেন্ড পেরিয়ে গেছে তা জানা যায়। এটি টাইমার হিসেবে ব্যবহৃত হয় এবং প্রোগ্রামের কার্যক্রমে কোন প্রকার বিলম্ব ঘটায় না।
unsigned long previousMillis = 0; // পূর্বের সময় সংরক্ষণ
const long interval = 1000; // ১ সেকেন্ডের ইন্টারভাল
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis(); // বর্তমান সময় পড়া
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // পূর্বের সময় আপডেট করা
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // LED-এর অবস্থা পরিবর্তন করা
}
}
কাজ: LED প্রতি ১ সেকেন্ড অন্তর অন এবং অফ হবে, কিন্তু প্রোগ্রামের অন্য অংশ চালু থাকবে।
micros()
ফাংশনmicros()
ফাংশন millis()
এর মতোই কাজ করে, তবে এটি মাইক্রোসেকেন্ড হিসেবে সময় পড়ে। এটি আরও সূক্ষ্ম সময় ব্যবধানের প্রয়োজন হলে ব্যবহার করা হয়।
unsigned long startTime = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
startTime = micros(); // বর্তমান মাইক্রোসেকেন্ড পড়া
Serial.print("Current Time: ");
Serial.println(startTime); // মাইক্রোসেকেন্ড আউটপুট
delay(1000); // ১ সেকেন্ড অপেক্ষা
}
কাজ: এখানে প্রতিবার লুপ চালানোর সময় বর্তমান সময় মাইক্রোসেকেন্ডে প্রিন্ট করা হবে।
millis()
এবং micros()
প্রোগ্রামের অন্য কার্যক্রমে বিলম্ব ঘটায় না, তাই একই সাথে একাধিক কাজ সম্পন্ন করা সম্ভব।millis()
ব্যবহার করে কোড নন-ব্লকিং করা যায়, যা প্রোগ্রামকে আরও কার্যকর করে তোলে।delay()
ফাংশন প্রোগ্রামের কার্যক্রম থামিয়ে দেয়: delay()
ব্যবহার করলে প্রোগ্রামের অন্য কাজগুলো স্থগিত থাকবে, তাই জটিল প্রকল্পে এটি কম ব্যবহার করা ভালো।millis()
এবং micros()
রোলওভার সমস্যা: ৪৯.৭ দিন পর millis()
এবং প্রায় ৭১ মিনিট পর micros()
পুনরায় ০ থেকে শুরু হয়। বড় প্রোজেক্টে এটি মাথায় রাখা গুরুত্বপূর্ণ।Timer Functions এর সঠিক ব্যবহার Arduino প্রোগ্রামে কার্যক্রম সময়মতো সম্পন্ন করতে এবং প্রোগ্রামের কার্যকারিতা বৃদ্ধি করতে সাহায্য করে।
Arduino-তে Interrupts একটি গুরুত্বপূর্ণ ফিচার যা একটি নির্দিষ্ট ইভেন্টের উপর ভিত্তি করে প্রোগ্রামকে স্থগিত করে এবং একটি নির্দিষ্ট ফাংশনকে চালু করে। এতে প্রোগ্রাম দ্রুত সাড়া দিতে পারে। Arduino-তে দুটি প্রধান ধরনের Interrupts রয়েছে: External Interrupts এবং Pin Change Interrupts।
External Interrupts তখন ব্যবহৃত হয় যখন একটি আউটসাইড ডিভাইস (যেমন বাটন) কোনো সিগন্যাল পাঠায়। Arduino-তে সাধারণত INT0 (পিন 2) এবং INT1 (পিন 3) ব্যবহার করা হয়।
volatile bool buttonPressed = false;
void setup() {
pinMode(2, INPUT_PULLUP); // পিন 2 ইনপুট হিসেবে কনফিগার করা
attachInterrupt(digitalPinToInterrupt(2), buttonISR, FALLING); // পিন 2 এ ইন্টারাপ্ট যুক্ত করা
Serial.begin(9600);
}
void loop() {
if (buttonPressed) {
Serial.println("Button was pressed!");
buttonPressed = false; // ইন্টারাপ্ট ফ্ল্যাগ রিসেট করা
}
}
void buttonISR() {
buttonPressed = true; // ইন্টারাপ্ট ফ্ল্যাগ সেট করা
}
volatile
: ভেরিয়েবলটি ইন্টারাপ্ট ফাংশনের দ্বারা পরিবর্তিত হচ্ছে, তাই এটি volatile
হিসেবে ডিফাইন করা হয়েছে যাতে প্রধান লুপে সঠিকভাবে পড়া যায়।attachInterrupt()
: এই ফাংশনটি পিন 2-তে একটি ইন্টারাপ্ট যুক্ত করে, যা পিনের মান FALLING (নিচের দিকে পরিবর্তন) হলে buttonISR
ফাংশনটি কল করে।buttonISR()
: ইন্টারাপ্ট ফাংশনটি ব্যতীত, এটি একটি ফ্ল্যাগ সেট করে যাতে মূল লুপে বোতাম চাপার তথ্য পাওয়া যায়।Pin Change Interrupts তখন ব্যবহৃত হয় যখন কোনো পিনের মান পরিবর্তন হয় (HIGH থেকে LOW বা LOW থেকে HIGH)। Arduino-তে সমস্ত ডিজিটাল পিনে Pin Change Interrupts সক্রিয় করা যায়।
volatile bool ledState = false;
void setup() {
pinMode(8, INPUT_PULLUP); // পিন 8 ইনপুট হিসেবে কনফিগার করা
pinMode(13, OUTPUT); // পিন 13 আউটপুট হিসেবে কনফিগার করা
PCMSK |= (1 << PCINT0); // পিন 8 এ পিন চেঞ্জ ইন্টারাপ্ট সক্রিয় করা
GIMSK |= (1 << PCIE); // পিন চেঞ্জ ইন্টারাপ্ট সক্রিয় করা
sei(); // গ্লোবাল ইন্টারাপ্ট সক্রিয় করা
}
void loop() {
// লুপ খালি রাখা হয়েছে
}
ISR(PCINT0_vect) {
ledState = !ledState; // LED স্টেট পরিবর্তন
digitalWrite(13, ledState); // LED এর স্টেট পরিবর্তন করা
}
PCMSK
এবং GIMSK
: পিন চেঞ্জ ইন্টারাপ্টস সক্রিয় করার জন্য পোর্ট এবং গ্লোবাল ইন্টারাপ্ট সেটিংস কনফিগার করা হয়।sei()
: গ্লোবাল ইন্টারাপ্ট সক্রিয় করা।ISR(PCINT0_vect)
: এই ফাংশনটি পিন চেঞ্জ ইভেন্টের সময় কল হয়, যেখানে LED এর স্টেট পরিবর্তন করা হয়।Arduino-তে ইন্টারাপ্ট ব্যবহার করার মাধ্যমে, আপনি প্রোগ্রামকে দ্রুত এবং কার্যকরভাবে সাড়া দিতে সক্ষম হবেন, যা আপনার প্রকল্পের কার্যকারিতা উন্নত করে।
common.read_more